package com.mmall.common;

import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

//token即存储在本地的缓存块，除了本例中用于防止横向越权的通过知道用户名和问题答案重置密码外，还可以用于用户自动注销、用户重复登陆、邮箱激活等
public class TokenCache {

	//用slf4j日志记录这个类中的问题
	private static Logger logger=LoggerFactory.getLogger(TokenCache.class);
	//token的前缀
	public static final String TOKEN_PREFIX = "token_";
	
	//initialCapacity:初始大小   maximumSize:缓存最大个数  expireAfterAccess:失效时间
	//用guava的方法创建本地缓存块，存储token，当token存储满了的时候，会调用LRU算法(最近最少使用)替换掉
	private static LoadingCache<String, String> localCache = CacheBuilder.newBuilder()
			.initialCapacity(1000)
			.maximumSize(10000)
			.expireAfterAccess(12, TimeUnit.HOURS)
			.build(new CacheLoader<String, String>(){
				//重写获取缓存的策略，当传来的key没有命中本地缓存，调用load方法获取结果
				//这里如果没有命中则认为本地没有对应的token，证明本次操作非法或过期，不是创建新的本地缓存，所以返回null
				//这里返回null这个字符串，是因为这是创建的方法，我们将在get的方法里判断是否是“null”来返回
				@Override
				public String load(String s) throws Exception{
					return "null";
				}
			});
	
	//设置token本地缓存的方法
	public static void setKey(String key,String value){
        localCache.put(key,value);
    }
	
	public static String getKey(String key){
        String value = null;
        try {
            value = localCache.get(key);
            if("null".equals(value)){
                return null;
            }
            return value;
        }catch (Exception e){
            logger.error("localCache get error",e);
        }
        return null;
    }
}
